package com.shihan._01_multi_thread_basic.callable;

import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @Description 用于测试 Callable 线程的 main方法类
 * @Author shihan
 * @Date 2021/8/8 17:09
 * @Version 1.0
 */
public class MyCallableMain01 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("main方法开始执行...");
        // 实例化 Callable 对象
        MyCallableThread myCallableThread = new MyCallableThread();
        // 需要丢到 FutureTask 里，并且 FutureTask 的返回值类型，要和 Callable 中 call 方法的返回值类型一致
        FutureTask<Map<String, Object>> futureTask = new FutureTask<>(myCallableThread);
        // 依然需要借助 Thread 类来启动线程，Thread 类的构造方法只有 Runnable 接口
        // 所以 FutureTask 必定已经实现了 Runnable 接口，并且支持有返回值，所以也实现了 Future 接口
        Thread thread = new Thread(futureTask);
        // 启动线程，去执行 Callable 中的 call 方法
        thread.start();

        // 此处将会阻塞等待，直到 call 方法返回了结果
        Map<String, Object> map = futureTask.get();
        System.out.println(map);
        System.out.println("main方法执行结束...");
    }

}
